package com.jmxcfc.blfsc.ssq.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

/**
 * 功能描述
 *
 * @author: pbs
 * @date: 2024年09月03日 9:59
 */
@Slf4j
public class Md5Util {
    private Md5Util() {

    }

    /**
     *
     * @param dataStr 源字符串
     * @return md5字符串
     * @throws Exception
     */
    public static String md5Digest(String dataStr) throws Exception {
        String newRequestBody = convertToUtf8(dataStr);
        byte[] data = newRequestBody.getBytes(StandardCharsets.UTF_8);
        return md5(data);
    }


    /**
     * 转换字符集到utf8
     *
     * @param src
     * @return
     */
    private static String convertToUtf8(String src) {
        if (StringUtils.isBlank(src)) {
            return src;
        }
        if (StandardCharsets.UTF_8.toString().equalsIgnoreCase(Charset.defaultCharset().name())) {
            return src;
        }
        byte[] srcData = src.getBytes();
        return new String(srcData, StandardCharsets.UTF_8);
    }

    /**
     * md5
     * @param data
     * @return
     */
    private static String md5(byte[] data) throws Exception{
        char[] hexDigits={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        // 获得MD5摘要算法的 MessageDigest 对象
        MessageDigest mdInst;
        try {
            mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(data);
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char[] str = new char[j * 2];
            int k = 0;
            for (byte byte0 : md) {
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            log.error("进行md5时异常,异常信息:{}",e.getMessage(),e);
            throw e;
        }

    }
}